﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Google.YouTube;

namespace WSongPrjFinal.Controllers.Youtube.Player
{
    public class UtilsYouYube
    {

        protected IList<Video> Videos = new List<Video>();

        /// Solicitação de objeto ao youtube.
        public YouTubeRequest GetYouTubeRequestObject()
        {
            var youTubeRequestSettings = new YouTubeRequestSettings(GlobalVar.UtilsVideo.YouTubeAccountName, string.Empty, GlobalVar.UtilsVideo.DeveloperKey);
            return new YouTubeRequest(youTubeRequestSettings);
        }

        /// Busca os vídeos favoritos pelo nome do usuário.
        /// <param name="usuario">Usuario.</param>
        /// <returns>IEnumerable VideoExtracted</returns>
        public IEnumerable<Video> GetFavouriteVideosByUserName(string usuario)
        {
            var feed = GetYouTubeRequestObject().GetFavoriteFeed(usuario);
            return feed.Entries;
        }

        /// Obtém os vídeos favoritos do usuario como lista nomeada
        /// <param name="usuario">Usuario.</param>
        /// <returns></returns>
        public IList<Video> GetFavouriteVideosByUserName_List(string usuario)
        {
            return GetFavouriteVideosByUserName(usuario).ToList();
        }

        /// Obtém a lista de informações do vídeo como lista pelo usuario.
        /// <param name="usuario">Usuario.</param>
        /// <returns></returns>
        public IList<VideoInfo> GetFavouriteVideosExtractedByUserName_List(string usuario)
        {
            return ExtractYouTubeVideoList(GetFavouriteVideosByUserName_List(usuario));
        }

        /// <summary>
        /// Extraindo informações do vídeo.
        /// </summary>
        /// <param name="video">Video.</param>
        /// <returns></returns>
        public VideoInfo ExtractYouTubeVideo(Video video)
        {
            var videoInfo = new VideoInfo
                                     {
                                         VideoId = video.VideoId, 
                                         Titulo = video.Title, 
                                         Descricao = video.Description
                                     };

            if (video.Thumbnails.Count > 0)
                videoInfo.Miniatura= "<img src=\"" + video.Thumbnails[0].Url + "\" alt=\"" + videoInfo.Titulo + "\" />";

            return videoInfo;
        }

        /// <summary>
        /// Extrai informação da lista de vídeo.
        /// </summary>
        /// <param name="listaVideo">Lista.</param>
        /// <returns></returns>
        public IList<VideoInfo> ExtractYouTubeVideoList(IList<Video> listaVideo)
        {
            return listaVideo.Select(ExtractYouTubeVideo).ToList();
        }

        /// Obtém o  HTML do player embutido usando as configurações padrão.
        /// <param name="videoId">ID do vídeo.</param>
        /// exemplo
        /// <code>
        /// div_to_hold_player.InnerHtml = googleAPI.GetEmbeddedPlayerHTML(video_id)
        /// </code>
        /// <returns>retorna string do html com o código do vídeo embutido(embbebed)</returns>
        public string GetEmbeddedPlayerHtml(string videoId)
        {
            return GetPlayerCode(videoId + EncodePlayerSettingsFromYouTubePlayerObjectToQueryString(new YouTubePlayer()));
        }

        /// codifica as configurações do player a partir da solicitação do usuario
        /// <param name="player">Player.</param>
        /// <returns>string (string codificada)</returns>
        private static string EncodePlayerSettingsFromYouTubePlayerObjectToQueryString(YouTubePlayer player)
        {
            var sb = new StringBuilder();

            sb.Append("?rel=" + player.LoadRelatedVideos);

            if (player.AutoPlay == 1) 
                sb.Append("&autoplay=" + player.AutoPlay);

            if (player.Loop == 1) 
                sb.Append("&loop=" + player.Loop);

            if (player.EnableJavaScriptApi == 1) 
                sb.Append("&enablejsapi=" + player.EnableJavaScriptApi);
            
            sb.Append("&playerapiid=" + player.PlayerApiId);

            if (player.DisableKeyboard == 1) 
                sb.Append("&disablekb=" + player.DisableKeyboard);

            if (player.EnhancedGenieMenu == 1) 
                sb.Append("&egm=" + player.EnhancedGenieMenu);

            if (player.Border == 1) 
                sb.Append("&border=" + player.Border);

            if (!string.IsNullOrEmpty(player.PrimaryBorderColor)) 
                sb.Append("&color1=" + player.PrimaryBorderColor);

            if (!string.IsNullOrEmpty(player.SecondaryBorderColor)) 
                sb.Append("&color2=" + player.SecondaryBorderColor);

            if (player.SecondsFromStart > 0) 
                sb.Append("&start=" + player.SecondsFromStart);

            if (player.FullScreen == 1) 
                sb.Append("&fs=" + player.FullScreen);

            if (player.Hd == 1) 
                sb.Append("&hd=" + player.Hd);

            if (player.ShowSearchBox == 0) 
                sb.Append("&showsearch=" + player.ShowSearchBox);

            if (player.ShowVideoInfo == 0) 
                sb.Append("&showinfo=" + player.ShowVideoInfo);

            if (player.VideoAnnotations == 3) 
                sb.Append("&iv_load_policy=" + player.VideoAnnotations);

            return sb.ToString();
        }

        /// recupera o código do player.
        /// <param name="videoUrl">URL do vídeo.</param>
        /// <returns></returns>
        private static string GetPlayerCode(string videoUrl)
        {
            var sb = new StringBuilder();

            sb.Append("<object width=\"" + GlobalVar.UtilsVideo.YouTubePlayerWidth + "\" height=\"" + GlobalVar.UtilsVideo.YouTubePlayerHeight + "\">");
            sb.Append("<param name=\"movie\" value=\"http://www.youtube.com/v/" + videoUrl + "\"></param>");
            sb.Append("<param name=\"allowFullScreen\" value=\"true\"></param>");
            sb.Append("<embed src=\"http://www.youtube.com/v/" + videoUrl + "\" type=\"application/x-shockwave-flash\" width=\""
                + GlobalVar.UtilsVideo.YouTubePlayerWidth + "\" height=\""
                + GlobalVar.UtilsVideo.YouTubePlayerHeight + "\" allowfullscreen=\"true\"></embed>");
            sb.Append("</object>");

            return sb.ToString();
        }

        /// Busca o vídeo através do id.
        /// <param name="videoId">Id do vídeo.</param>
        /// <returns>objeto Video</returns>
        public Video GetVideoUsingVideoId(string videoId)
        {
            var videoEntryUrl = new Uri(GlobalVar.UtilsVideo.VideoEntryUrl + videoId);

            try
            {
                return GetYouTubeRequestObject().Retrieve<Video>(videoEntryUrl);
            }
            catch (Exception)
            {
                return null;
            }
        }
    }
} 